﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using Estructuras.Comunes;

namespace Estructuras.Consola.ConsolaSeleccionarDatos
{
    /// <summary>
    /// Almacena las propiedades de un elemento específico.
    /// </summary>
    public class PSeleccionarDatos : Propiedades
    {
        /// <summary>
        /// Entrada de datos.
        /// </summary>
        public string Entrada
        {
            get
            {
                return this.getPropiedadString(CSeleccionarDatos.Entrada);
            }
            set
            {
                this.setOrAddPropiedad(CSeleccionarDatos.Entrada, value);
            }
        }

        /// <summary>
        /// Estructura de entrada y de salida.
        /// </summary>
        public string Estructura
        {
            get
            {
                return this.getPropiedadString(CSeleccionarDatos.Estructura);
            }
            set
            {
                this.setOrAddPropiedad(CSeleccionarDatos.Estructura, value);
            }
        }

        /// <summary>
        /// Lista de salidas de datos.
        /// </summary>
        public List<string> ListaSalidas
        {
            get
            {
                return this.getPropiedadListaString(CSeleccionarDatos.Salidas);
            }
            set
            {
                this.setOrAddPropiedad(CSeleccionarDatos.Salidas, value);
            }
        }

        /// <summary>
        /// Lista de criterios de selección de datos.
        /// </summary>
        public List<string> ListaCriteriosSeleccion
        {
            get
            {
                return this.getPropiedadListaString(CSeleccionarDatos.CriteriosSeleccion);
            }
            set
            {
                this.setOrAddPropiedad(CSeleccionarDatos.CriteriosSeleccion, value);
            }
        }

        /// <summary>
        /// Lista de criterios para el ordenado de datos.
        /// </summary>
        public List<string> ListaCriteriosOrden
        {
            get
            {
                return this.getPropiedadListaString(CSeleccionarDatos.CriteriosOrden);
            }
            set
            {
                this.setOrAddPropiedad(CSeleccionarDatos.CriteriosOrden, value);
            }
        }



        /// <summary>
        /// Constructor por defecto.
        /// </summary>
        public PSeleccionarDatos()
            : base()
        {
        }

        /// <summary>
        /// Obtiene los parámetros a partir del fichero XML indicado.
        /// </summary>
        /// <param name="fichero">Fichero de configuración XML</param>
        override public void leer(string fichero)
        {
            base.leer(fichero);
            XmlDocument xml = LeerXml.AbrirFicheroParametros(fichero);

            this.Entrada = LeerXml.ObtenerValorCampo(xml, CSeleccionarDatos.RutaEntrada);
            this.Estructura = LeerXml.ObtenerValorCampo(xml, CSeleccionarDatos.RutaEstructura);

            // Salidas
            int numeroSalidas = LeerXml.ObtenerNumeroNodosCampo(xml, CSeleccionarDatos.RutaSalidas);
            for (int indiceSalida = 0; indiceSalida < numeroSalidas; indiceSalida++)
            {
                string salida = LeerXml.ObtenerValorCampo(xml, CSeleccionarDatos.RutaSalidas, indiceSalida, "./" + CSeleccionarDatos.NodoSalidaSalida);
                if (!string.Empty.Equals(salida))
                {
                    this.ListaSalidas.Add(salida);

                    // Criterios seleccion
                    string criterioS = LeerXml.ObtenerValorCampo(xml, CSeleccionarDatos.RutaSalidas, indiceSalida, "./" + CSeleccionarDatos.NodoSalidaCriterio);
                    this.ListaCriteriosSeleccion.Add(criterioS);

                    // Criterios orden
                    string criterioO = string.Empty;
                    try
                    { criterioO = LeerXml.ObtenerValorCampo(xml, CSeleccionarDatos.RutaSalidas, indiceSalida, "./" + CSeleccionarDatos.NodoSalidaOrden); }
                    catch (Exception)
                    { criterioO = string.Empty; }
                    this.ListaCriteriosOrden.Add(criterioO);
                }
            }
        }
    }
}
